// import router from '@/router'
import type { RouteRecordRaw } from 'vue-router'

function loadLocalRouters() {
  // _1. 动态获取所有的路由对象
  //  *. 路由对象都在独立的文件中
  //  *. 从文件中将所有的路由对象先读取到数组中
  //  路由对象localRouters的类型 => RouteRecordRaw[]
  const localRouters: RouteRecordRaw[] = []
  // _1.1. 读取router/main下的所有ts文件
  //    require.context() => webpack中的加载方法
  //    files默认为Record<string, unknown>覆写为any
  const files: Record<string, any> = import.meta.glob('../router/main/**/*.ts', {
    eager: true
  })
  // console.log(files)

  // _1.2. 将加载的对象进行存储
  //    收集获取到的src/router/main下的所有路由
  for (const key in files) {
    const module = files[key]
    localRouters.push(module.default)
  }
  return localRouters
}

export let firstMenu: any = null

export function mapMenusToRoutes(userMenus: any[]) {
  // 1. 动态获取所有的路由对象
  const localRouters = loadLocalRouters()
  // 2 根据后端返回的菜单去匹配正确的路由
  const routes: RouteRecordRaw[] = []
  for (const menu of userMenus) {
    // 一级路由非组件，不需要操作 遍历二级路由menu.children
    for (const submenu of menu.children) {
      const route = localRouters.find((item) => item.path === submenu.url)
      // 将符合条件的路由通过router.addRoute挂载到'main'下
      // 抽离工具只负责处理并返回结果而不应该参与对结果使用
      // if (route) router.addRoute('main', route)
      if (route) {
        // 对上级菜单(一级)进行重定向redirect，使一级菜单路由指向一级菜单的第一个二级菜单
        // if条件指的是routers中不存在path和上级菜单的url一致的情况，即此时判定通过的条件为第一次循环
        if (!routes.find((item) => item.path === menu.url)) {
          routes.push({ path: menu.url, redirect: route.path })
        }
        // 将二级菜单添加到routes
        routes.push(route)
      }
      // 记录第一个被匹配到的路由
      if (!firstMenu && route) firstMenu = submenu
    }
  }
  return routes
}

/**
 * 根据路径去匹配需要显示的菜单
 * @param path 需要匹配的路径
 * @param userMenus 所有的子路由菜单
 */
export function mapPathToMenu(path: string, userMenus: any[]) {
  for (const menu of userMenus) {
    for (const submenu of menu.children) {
      if (submenu.url === path) {
        return submenu
      }
    }
  }
}

interface IBreadcrumbs {
  name: string
  path: string
}
export function mapPathToBreadcrumbs(path: string, userMenus: any[]) {
  // 1.定义面包屑
  const breadcrumbs: IBreadcrumbs[] = []

  // 2.遍历获取面包屑层级
  for (const menu of userMenus) {
    for (const submenu of menu.children) {
      if (submenu.url === path) {
        // 1.顶层(上层)菜单
        breadcrumbs.push({ name: menu.name, path: menu.url })
        // 2.匹配(当前)菜单
        breadcrumbs.push({ name: submenu.name, path: submenu.url })
      }
    }
  }
  return breadcrumbs
}

/**
 * 菜单映射到id的列表
 * @param menuList
 */
export function mapMenuListToIds(menuList: any[]) {
  const ids: number[] = []

  function recurseGetId(menus: any[]) {
    for (const item of menus) {
      if (item.children) {
        recurseGetId(item.children)
      } else {
        ids.push(item.id)
      }
    }
  }
  recurseGetId(menuList)

  return ids
}

/**
 * 从菜单映射到按钮的权限
 * @param menuList 菜单的列表
 * @returns 权限的数组(字符串数组)
 */
export function mapMenusToPermissions(menuList: any[]) {
  const permissions: string[] = []

  function recurseGetPermission(menus: any[]) {
    for (const item of menus) {
      // 此数组中第三级的时候type为3
      if (item.type === 3) {
        permissions.push(item.permission)
      } else {
        recurseGetPermission(item.children ?? [])
      }
    }
  }
  recurseGetPermission(menuList)

  return permissions
}
